/**
 * 对uni.request进行二次封装
 */
import env from "./env";
import { getToken, setToken } from "./auth.js";
import { getItem } from "./localStorage";
import useUserStore from "@/store/modules/user";
import { refresh } from "@/api/login";
import { Alert } from "./tool";

const useStore = useUserStore();

const request = (options = {}) => {
  options.url = `${env.baseUrl}${options.url}`;

  const token = getToken();
  // 判断本地是否存在token， 如果存在则带上请求头
  if (token) {
    options.header = {
      "content-type": "application/json",
      // Authorization: `Bearer ${token || false}`, // 这里是token（可自行修改）
      Authorization: `${token || false}`, // 这里是token（可自行修改）
    };
  }

  // 请求方法
  options.method = options.method || "GET";

  // uni.showToast({
  //   title: "加载中...",
  //   icon: "loading",
  //   mask: true
  // })

  // resolve是返回成功数据，reject返回错误数据
  return new Promise((resolve, reject) => {
    // 请求成功
    options.success = (res) => {
      // console.log("res.data.code：", res.data.code);
      // 如果请求回来的状态码不是200则执行一下操作
      if (res.data.code !== 200) {
        // 非成功状态码弹窗
        // uni.showToast({
        //   title: `${res.data.msg}`,
        //   icon: "none",
        //   duration: 2000
        // })

        // 登录失效（token过期或未登录）
        if (res.data.code === 401) {
          // 将登录状态改为false
          useStore.updateLoginStatus(false);

          // 检测是否有token
          if (getItem("token")) {
            // 登录了但是token过期了（用信息还存放着）（只是改变了用户的登录状态）
            // 这里为了提升用户体验就不提示了
            // Alert("登录已过期，请重新登录");

            // 无感刷新token
            refresh().then((res) => {
              console.log("token过期了，刷新令牌！");
              // 设置新的token
              setToken(res.data.data);
              uni.reLaunch({
                url: `/${
                  getCurrentPages()[getCurrentPages().length - 1].route
                }`,
              });
            });
          }

          // 清楚所有本地缓存
          // clearAll();

          // 关闭所有页面返回到登录页
          // uni.reLaunch({
          //   url: "/pages/login/index"
          // })
        }
        // 返回错误信息
        resolve(res);
      } else {
        // uni.hideToast()
        // 请求回来的状态码为200则返回数据
        resolve(res);
      }
    };
    // 请求失败
    options.fail = (err) => {
      console.log(err);
      // 请求失败弹窗
      // uni.showToast({
      //   title: "",
      //   icon: "none",
      //   duration: 2000,
      // });
      // Alert("网络异常，请检查网络!", "none", 2000);
      // reject(err)
    };

    // 发请求（上面是配置选项）
    uni.request(options);
  });
};

// 默认暴露
export default request;
